ofsp2026 03_wmake
Created time
Mar 28, 2026 05:12 AM
type
Post
status
Published
date
Mar 28, 2026
slug
ofsp2026 03_wmake
summary
tags
ofsp2026
OpenFOAM
category
post
icon
password
Place
Last edited time
Mar 28, 2026 09:12 AM
Important
访问 https://aerosand.cc 以获取最近更新。
0. 前言
在理解了 C++ 项目的 make 实现方式之后,我们现在可以更加容易的明白 OpenFOAM 提供的 wmake 实现方式。
本文主要
简单理解 wmake
wmake 实现直接链接
wmake 实现动态库链接
理解 Make 文件
编译运行 wmake 项目
1. 理解 wmake
OpenFOAM 中的 wmake 是一个基于 make 的构建工具,本质上是专门为 OpenFOAM 项目设计的一组脚本和配置文件。它简化了 OpenFOAM 的编译过程,并自动处理一些特定的依赖和路径设置。
- wmake 是一个包装了 make 的脚本,它设置了 OpenFOAM 编译所需的环境变量和规则
- wmake 会自动查找 OpenFOAM 的特定目录结构,并设置相应的编译选项(如包含路径、库路径等)
- wmake 提供了与 make 相似的接口,但针对 OpenFOAM 进行了优化
OpenFOAM 使用
Make/files 和 Make/options 实现 wmake 的编译管理。Tip
可以简单理解为,Make 文件夹下的 files 和 options 两个文件一起承担了 makefile 的功能。
OpenFOAM 约定源文件后缀为
.C,头文件后缀为 .H 。为了让读者不要对文件架构感到困扰,这里作了不严谨的区分。OpenFOAM “项目层面” 的
.H 文件更多只是为了对主源码按功能进行拆分,方便代码阅读和维护,很多并不是类的头文件。这和 C++ 开发层面的头文件以及 OpenFOAM “源码层面”的头文件(如 $FOAM_SRC/OpenFOAM/dimensionSet/dimensionSet.H)有些不同。Tip
OpenFOAM 中,应用(application)包括
- 求解器(Solvers)
- 工具程序(Utilities)
- 预处理程序(Pre-processing Applications)
- 后处理程序(Post-processing Applications)
在本系列讨论中,我们所说的 “项目 Project” 是完整解决某个问题的所有内容,包括
- 求解器
- 调试算例
- 调用库
- 工具程序
- 等等
本文下面讨论的是简单的“源码层面”头文件。
2. 项目
终端输入命令,建立本文项目
继续使用终端命令或者使用 vscode 界面创建其他文件,最终文件结构如下
库 Aerosand 的声明
Aerosand.H 如下Warning
注意每个代码文件的最后都需要留个一个空白行,否则编译时 OpenFOAM 会警告
parse error库 Aerosand 的定义
Aerosand.C 如下应用主源码
ofsp_03_wmake.C 如下OpenFOAM 提供了 Make 文件来帮助开发,其中
/Make/files文件用于指定要编译的源文件以及生成的目标文件的名称和位置
/Make/options文件用于指定编译和链接选项,包括头文件路径和需要链接的库
注意,
#include "Aerosand.H" 无需指定路径,这是因为我们将在 Make 文件中处理路径问题。下面将讨论不同连接方式以及 Make 文件的细节。
3. 直接链接
类似于
02_helloWorld/3.4.链接 文中讨论的直接链接,OpenFOAM 中也可以实现。3.1. 配置 Make
文件
ofsp_03_wmake/Make/files 内容如下- 源文件为
Aerosand.C和ofsp_03_wmake.C
- 生成目标文件的位置为
$(FOAM_USER_APPBIN)
- 生成目标文件的名称为
ofsp_03_wmake
文件
ofsp_03_wmake/Make/options 内容如下- 前缀 EXE 表示这是可执行文件的配置(前缀 LIB 表示是库文件的配置)
- 后缀 INC 表示包含路径
- 使用
I标志指定头文件搜索路径 - 通常指向 OpenFOAM 模块的
lnInclude目录(链接包含目录) - 可以包含系统头文件路径或第三方库头文件路径
- 后缀 LIBS 表示库链接(直接链接无需链接任何库,可以留空不写)
- 使用
l标志指定需要链接的库 - 库名称不需要前缀
lib和后缀.so(如lfiniteVolume对应libfiniteVolume.so) - 使用
L标志指定库搜索路径
终端输入命令,执行编译
3.2. 编译
终端输出信息有三段,对应着应用编译的三个过程。
第一段是自定义的 Aerosand 类编译得到目标文件
Aerosand.o (见输出信息的末尾处)第二段是主源码编译得到目标文件
ofsp_03_wmake.o (见输出信息的末尾处)第三段是链接的过程,此处就是上述两个目标文件的直接链接,最终生成可执行文件(见输出信息的末尾处)
编译的过程文件在
ofsp_03_wmake/Make/linux64GccDPInt32Opt/ 文件夹下(根据平台可能会有所不同)。编译形成的可执行程序在 $FOAM_USER_APPBIN 文件夹下(上文在 Make/files 中指定)。终端输入命令,可以找到所有生成成功的可执行程序
3.3. 运行
这个可执行程序是个独立的程序,不需要从任何外部文件读取参数。得益于 OpenFOAM 环境变量,我们可以在任何路径下,都可以通过终端命令直接运行编译成功的程序。
终端输入命令
可以看到运行结果
4. 动态库链接
在实际的开发中,我们还是要使用动态库来保证内存和效率。
调整文件结构如下
4.1. 库 Make
为库创建 Make 文件
Loading...